
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation

# 基本神经网络以及CNN两种模型的Param计算过程
"""
1.在keras中，使用model.summary()输出模型各层的参数情况：
  通过这些参数，可以里看到模型各个层的组成，以及数据经过每个层后，输出的数据维度，以及Param——表示每个层参数的个数

2.在tensorflow中model.compile(optimize = 优化器，loss= 损失函数，mertics = ["准确率"])
model.complile()——用于在配置训练方法时，高职训练时所使用的优化器、损失函数、和准确率评价标准
（1）优化器：Adam、SGD、adagrad、adadelta
（2）loss——经常使用softmax函数来将输出转换为概率分布的形式
    loss:MSE或者tf.keras.losses.MeanSquardError()
    sparse_categorical_crossentropy或者tf.keras.losses.SparseCatagoricalCrossentropy(from_logits = False)
    其中from_logits代表是否将输出转为概率分布的形式，取值True——代表不转换，直接输出；取值False——表示转为概率分布
（3）Metrics标注网络评价指标

例如：
        "accuracy" : y_ 和 y 都是数值，如y_ = [1] y = [1]  #y_为真实值，y为预测值

        “sparse_accuracy":y_和y都是以独热码 和概率分布表示，如y_ = [0, 1, 0], y = [0.256, 0.695, 0.048]

        "sparse_categorical_accuracy" :y_是以数值形式给出，y是以 独热码给出，如y_ = [1], y = [0.256 0.695, 0.048]

"""


# （1）基本神经网络Param计算过程
"""
 全连接层神经网络的param,指的是每层神经元权重的个数：计算过程：
 Param = (输入数据维度 + 1（加1：指考虑每一个神经元都有一个Bias）) * 神经元个数
(1)第一个Dense层，输入的数据维度是4（一维数据），有7个神经元，所以Param = (4 _+ 1) * 7 = 35
(2)第二个dense层，输入数据维度是7（经过第一层7个神经元作用之后，输出数据维度就是7了），有13个神经元，所以Param = (7 + 1) * 13 = 104
(3)第三个Dense层，输入数据维度是13（经过第二层13个神经元作用之后，输出数据维度就是13了），有5个神经元，所以Param = （13 + 1） * 5 = 70
"""

# 构建一个简单的神经网络模型：包含3个连接层

# 顺序模型
model = Sequential()

# 输入层
model.add(Dense(7,input_shape = (4,)))# Dense就是常用的全连接层
model.add(Activation('sigmoid'))
# 隐藏层
model.add(Dense(13))
model.add(Activation('sigmoid'))

# 输出层
model.add(Dense(5))
model.add(Activation('softmax'))
# tensorflow中model.compile()——用于在配置训练方法时，告知训练时使用的优化器、损失函数和准确率评测标准

model.compile(optimizer = 'adam',loss = 'categorical_crossentropy',metrics = ["accuracy"])

model.summary()
